#!/bin/bash

# Java进程网络连接检查脚本
# 功能：检查Java进程是否有网络连接，如果没有则终止进程

echo "开始检查Java进程..."
echo "当前执行用户: $(whoami)"

# 检查是否有足够权限
if [ "$EUID" -ne 0 ] && [ "$(whoami)" != "root" ]; then
    echo "警告: 当前不是以root用户运行，可能无法终止其他用户的Java进程"
    echo "如果遇到权限问题，请使用 sudo 执行此脚本"
fi

# 获取所有Java进程的PID
java_pids_array=($(ps -ef | grep -v grep | grep java | awk '{print $2}'))
echo "发现 ${#java_pids_array[@]} 个Java进程"

# 如果没有Java进程，直接退出
if [ ${#java_pids_array[@]} -eq 0 ]; then
    echo "未发现Java进程，脚本退出"
    exit 0
fi

# 获取有网络连接的Java进程PID
ss_pids_array=($(ss -antpl | grep java | awk '{print $6}' | grep -o 'pid=[0-9]*' | cut -d= -f2 | sort -u))
echo "发现 ${#ss_pids_array[@]} 个有网络连接的Java进程"

# 遍历所有Java进程
for java_pid in "${java_pids_array[@]}"; do
    echo -n "检查进程 $java_pid ... "
    
    # 检查该PID是否在网络连接列表中
    found=false
    for ss_pid in "${ss_pids_array[@]}"; do
        if [ "$java_pid" = "$ss_pid" ]; then
            found=true
            break
        fi
    done
    
    if [ "$found" = true ]; then
        echo "有网络连接，保留"
    else
        echo "无网络连接，准备终止"
        # 先检查进程是否仍然存在
        if kill -0 "$java_pid" 2>/dev/null; then
            echo "正在终止进程 $java_pid"
            
            # 获取进程详细信息用于诊断
            process_info=$(ps -p "$java_pid" -o pid,ppid,user,cmd --no-headers 2>/dev/null)
            if [ -n "$process_info" ]; then
                echo "进程信息: $process_info"
            fi
            
            # 尝试终止进程并捕获错误
            kill_output=$(kill -9 "$java_pid" 2>&1)
            kill_result=$?
            
            if [ $kill_result -eq 0 ]; then
                echo "进程 $java_pid 终止命令执行成功"
                # 等待一小段时间后检查进程是否真的被终止
                sleep 1
                if ! kill -0 "$java_pid" 2>/dev/null; then
                    echo "进程 $java_pid 已成功终止"
                else
                    echo "警告: 进程 $java_pid 可能仍在运行"
                fi
            else
                echo "终止进程 $java_pid 失败，返回码: $kill_result"
                echo "错误信息: $kill_output"
                
                # 检查可能的原因
                current_user=$(whoami)
                process_owner=$(ps -p "$java_pid" -o user --no-headers 2>/dev/null | tr -d ' ')
                
                if [ -n "$process_owner" ] && [ "$current_user" != "$process_owner" ] && [ "$current_user" != "root" ]; then
                    echo "可能原因: 权限不足，当前用户($current_user)无法终止属于用户($process_owner)的进程"
                    echo "建议: 使用sudo执行此脚本，或切换到进程所有者账户"
                fi
            fi
        else
            echo "进程 $java_pid 已不存在或无法访问"
        fi
    fi
done

echo "检查完成"